package Huihu.src.Duoxiancheng;

import java.util.concurrent.*;
/*
Callables的好处
1、有返回值
2、可以丢出异常
 */
public class Callables implements Callable <String>{
    private int tickets = 10 ;
    @Override
    public String call() throws Exception{
        for(int x = 0 ; x < tickets ; x ++){
            if(tickets > 0 ){
                System.out.println(Thread.currentThread().getName()+"卖票,tickets = " + this.tickets --) ;
            }
        }
        return "票已卖光" ;
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Callables m1 = new Callables () ;
        Callables m2 = new Callables () ;
        FutureTask<String> f1 = new FutureTask<String>(m1) ;//目的是为了取得call()方法的返回值
        FutureTask<String> f2 = new FutureTask<String>(m2) ;//目的是为了取得call()方法的返回值
        //FutureTask类是Runnable接口的子类，所以可以使用Thread类的构造来接收FutureTask的实例化对象
        new Thread(f1).start() ;
        new Thread(f2).start() ;
        //多线程执行完毕后可以取得返回值，依靠FutureTask的父接口Future中的get()方法完成
        System.out.println("线程1的返回结果：" + f1.get()) ;
        System.out.println("线程2的返回结果：" + f2.get()) ;
    }
}
